#include <TimerOne.h>
float v;
volatile long counter_val0=0;
volatile long counter_val1=0;      //该变量用于存储编码器的值，所以用类型修饰符volatile；
int j=0;                           //定时器标志；
 
void setup()
{
  delay(2000);
  pinMode(2, INPUT);
  pinMode(3, INPUT);                    //设置为输入模式，并且2,3号引脚是中断口0,1；

  Serial.begin(115200);                //初始化波特率为115200
  attachInterrupt(0, counter0, RISING);//设置编码器A相位上升沿中断
  attachInterrupt(1, counter1, RISING);//设置编码器B相位上升沿中断
  Timer1.initialize(50000);            // 设置定时器中断时间，单位微秒 ，这里是50毫秒
  Timer1.attachInterrupt( timerIsr ); // 打开定时器中断
  interrupts();                      //打开外部中断
}
void loop()
{
  long lTemp = 0; //定义临时存储数据变量
  if(j==1)        //判断是否发生定时器中断，这里是50ms发生一次
   {
       j=0;       //清除标记
   }     
}
//外部中断处理函数
void counter0()
{
     counter_val0++;    //每一个中断加一
}
void counter1()
{
     counter_val1++;    //每一个中断加一
}
//定时器中断处理函数
void timerIsr()
{
   j=1;                           //定时时间达到标志     
   v=60*20*counter_val0/150.0;    //这里的单位是转每分钟：r/min
   Serial.println(v);    
   counter_val0=0;
   counter_val1=0;               //清空该时间段内的脉冲数
   return v;                
}
//参考：https://blog.csdn.net/xwwwj/article/details/104656560
